﻿using System;
using System.Collections.Generic;
using BLToolkit.Data;
using BLToolkit.DataAccess;
using PMIS.BLL.System;

namespace PMIS.BLL.Department
{
	/// <summary>
	/// 部门管理
	/// </summary>
	public class BL_部门 : BL_Common<部门>
	{
		/// <summary>
		/// 保存
		/// </summary>
		/// <param name="item">部门信息</param>
		/// <returns></returns>
		public override bool Save(部门 item)
		{
			if (item == null)
				return false;

			bool result = false;
			DbManager dm = null;
			try
			{
				//	创建数据库实例
				dm = BL_DatabaseConnection.CreateConnection();

				SqlQuery<部门> sq = new SqlQuery<部门>(dm);
				//	根据上级部门路径来确定新部门班组节点的路径
				if (item.上级部门ID == "0")
				{
					//	顶级部门班组路径为名称
					item.路径 = item.名称;
				}
				else
				{
					部门 pd = sq.SelectByKey(item.上级部门ID);
					if (pd == null)
						throw new Exception("保存部门信息时发生错误:无法获取上级部门信息!");

					item.路径 = string.Format("{0}/{1}", pd.路径, item.名称);
				}
				
				if (string.IsNullOrEmpty(item.ID))
				{
					//	新增
					item.ID = Guid.NewGuid().ToString("D");
					result = sq.Insert(item) > 0;
				}
				else
				{
					//	修改
					result = sq.Update(item) > 0;
				}
			}
			catch (Exception ex)
			{
				BL_ExceptionOperation.WriteException(ex, dm);
				result = false;
			}
			finally
			{
				if (dm != null)
				{
					dm.Close();
					dm.Dispose();
					dm = null;
				}
			}

			return result;
		}
		/// <summary>
		/// 删除
		/// </summary>
		/// <param name="ID">部门ID</param>
		/// <param name="message">反馈消息</param>
		/// <returns></returns>
		public bool Delete(string ID, ref string message)
		{
			if (string.IsNullOrEmpty(ID))
				return false;

			bool result = false;
			DbManager dm = null;
			try
			{
				//	创建数据库实例
				dm = BL_DatabaseConnection.CreateConnection();

				//	检测是否有关联岗位
				List<岗位> listPost = dm.SetCommand("Select P.* From 岗位 P Where P.部门班组ID = @ID Order By P.岗位名称 Asc",
					dm.Parameter("ID", ID))
					.ExecuteList<岗位>();
				if (listPost == null)
					throw new Exception("删除部门信息时发生错误:无法获取关联的岗位信息!");

				if (listPost.Count > 0)
				{
					//	还有关联岗位，不能删除
					result = false;
					message = listPost.Count == 1 ? string.Format("还有岗位[{0}]关联该部门，不能删除！", listPost[0].岗位名称) :
						string.Format("还有岗位[{0}]等{1}个岗位关联该部门，不能删除！", listPost[0].岗位名称, listPost.Count);
				}
				else
				{
					//	检测是否有关联人员
					List<人员> listUser = dm.SetCommand("Select U.* From 人员 U Where U.部门班组ID = @ID Order By U.姓名 Asc",
						dm.Parameter("ID", ID))
						.ExecuteList<人员>();
					if (listUser == null)
						throw new Exception("删除部门信息时发生错误:无法获取关联的人员信息!");

					if (listUser.Count > 0)
					{
						//	还有关联岗位，不能删除
						result = false;
						message = listPost.Count == 1 ? string.Format("该部门下还有人员[{0}]，不能删除！", listUser[0].姓名) :
							string.Format("该部门下还有[{0}]等{1}人，不能删除！", listUser[0].姓名, listUser.Count);
					}
					else
					{
						result = new SqlQuery<岗位>(dm).DeleteByKey(ID) > 0;
					}
				}
			}
			catch (Exception ex)
			{
				BL_ExceptionOperation.WriteException(ex, dm);
				message = ex.Message;
				result = false;
			}
			finally
			{
				if (dm != null)
				{
					dm.Close();
					dm.Dispose();
					dm = null;
				}
			}

			return result;
		}
	}
}
